home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / Games / WHDLoad / Src / slave-examples / battleisle.asm next >
Encoding:
Assembly Source File  |  2001-09-02  |  10.9 KB  |  552 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    battelisle.asm
  3. ;  :Contents.    Slave for "Battle Isle" from Blue Byte
  4. ;  :Author.    Wepl
  5. ;  :Original    v1 wepl@whdload.org
  6. ;  :Version.    $Id: battleisle.asm 0.7 2001/09/02 14:08:39 wepl Exp wepl $
  7. ;  :History.    04.03.00 started
  8. ;        16.04.00 finished
  9. ;        11.05.00 support for us-version added
  10. ;        24.11.00 keyboard fixed
  11. ;        20.12.00 small change
  12. ;        03.08.01 cleanup for new kickemu
  13. ;  :Requires.    -
  14. ;  :Copyright.    Public Domain
  15. ;  :Language.    68000 Assembler
  16. ;  :Translator.    Devpac 3.14, Barfly 2.9
  17. ;  :To Do.
  18. ;---------------------------------------------------------------------------*
  19.  
  20.     INCDIR    Includes:
  21.     INCLUDE    whdload.i
  22.     INCLUDE    whdmacros.i
  23.  
  24.     IFD BARFLY
  25.     OUTPUT    "wart:b/battleisle/BattleIsle.Slave"
  26.     BOPT    O+                ;enable optimizing
  27.     BOPT    OG+                ;enable optimizing
  28.     BOPT    ODd-                ;disable mul optimizing
  29.     BOPT    ODe-                ;disable mul optimizing
  30.     BOPT    w4-                ;disable 64k warnings
  31.     SUPER
  32.     ENDC
  33.  
  34. UPPER    MACRO
  35.         cmp.b    #"a",\1
  36.         blo    .l\@
  37.         cmp.b    #"z",\1
  38.         bhi    .l\@
  39.         sub.b    #$20,\1
  40. .l\@
  41.     ENDM
  42.  
  43. ;============================================================================
  44.  
  45. CHIPMEMSIZE    = $66000
  46. FASTMEMSIZE    = $49000
  47. NUMDRIVES    = 1
  48. WPDRIVES    = %1111
  49.  
  50. DISKSONBOOT
  51. ;HRTMON
  52. ;MEMFREE    = $100
  53. ;NEEDFPU
  54. ;SETPATCH
  55.  
  56. ;============================================================================
  57.  
  58. KICKSIZE    = $40000            ;34.005
  59. BASEMEM        = CHIPMEMSIZE
  60. EXPMEM        = KICKSIZE+FASTMEMSIZE
  61.  
  62. ;============================================================================
  63.  
  64. _base        SLAVE_HEADER            ;ws_Security + ws_ID
  65.         dc.w    13            ;ws_Version
  66.         dc.w    WHDLF_NoError|WHDLF_Req68020|WHDLF_EmulTrap    ;ws_flags
  67.         dc.l    BASEMEM            ;ws_BaseMemSize
  68.         dc.l    0            ;ws_ExecInstall
  69.         dc.w    _start-_base        ;ws_GameLoader
  70.         dc.w    _data-_base        ;ws_CurrentDir
  71.         dc.w    0            ;ws_DontCache
  72. _keydebug    dc.b    0            ;ws_keydebug
  73. _keyexit    dc.b    $59            ;ws_keyexit = F10
  74. _expmem        dc.l    EXPMEM            ;ws_ExpMem
  75.         dc.w    _name-_base        ;ws_name
  76.         dc.w    _copy-_base        ;ws_copy
  77.         dc.w    _info-_base        ;ws_info
  78.  
  79. ;============================================================================
  80.  
  81.     IFD BARFLY
  82.     DOSCMD    "WDate  >T:date"
  83.     ENDC
  84.  
  85. _name        dc.b    "Battle Isle",0
  86. _copy        dc.b    "1991 Blue Byte",0
  87. _info        dc.b    "adapted by Wepl",10
  88.         dc.b    "Version 1.4 "
  89.     IFD BARFLY
  90.         INCBIN    "T:date"
  91.     ENDC
  92.         dc.b    0
  93. _data        dc.b    "data",0
  94. _introe        dc.b    "intro.prg.en",0
  95. _introd        dc.b    "intro.prg.de",0
  96. _main        dc.b    "battle.prg",0
  97. _desert        dc.b    "d01/battle20.prg",0
  98. _moon        dc.b    "d02/mond.dwn",0
  99.  
  100. _extrad        dc.b    "LIB/PART.TAB",0    ;only desert
  101.         dc.b    "LIB/PATT.LIB",0
  102.  
  103. _extram        dc.b    "00.PAL",0        ;both
  104.         dc.b    "01.PAL",0
  105.         dc.b    "AMOK.DAT",0
  106.         dc.b    "BNIM/FAB00.ANI",0
  107.         dc.b    "BNIM/FAB01.ANI",0
  108.         dc.b    "GROUND.DAT",0
  109.         dc.b    "KOCW.DAT",0
  110.         dc.b    "LIB/PART.LIB",0
  111.         dc.b    "LIB/PFIGHT.LIB",0
  112.         dc.b    "MENU.PAL",0
  113.         dc.b    "MENU.PCK",0
  114.  
  115.         dc.b    "UNIT.DAT",0        ;only moon
  116.         dc.b    "LOOSER.SND",0
  117.         dc.b    "STATS.PCK",0
  118.         dc.b    "WINNER.SND",0
  119.         dc.b    "MOND.DWN",0
  120.         dc.b    "BNIM/END.PAL",0
  121.         dc.b    "BNIM/END.SND",0
  122.         dc.b    "BNIM/HQ.PAL",0
  123.         dc.b    "BNIM/TOT.ANI",0
  124.         dc.b    "BNIM/TOT.PAL",0
  125.         dc.b    "BNIM/END.ANI",0
  126.         dc.b    "BNIM/HQ.SND",0
  127.         dc.b    "BNIM/TOT.SND",0
  128.         dc.b    "BNIM/HQ.ANI",0
  129.         dc.b    "LIB/PBIGUNIT.LIB",0
  130.         dc.b    "LIB/UNIT.LIB",0
  131.         dc.b    "LIB/CURSOR.LIB",0
  132.         dc.b    "GAME.PAL",0
  133.         dc.b    "GAME.SND",0
  134.         dc.b    "MAP02.LIB",0
  135.         dc.b    "MAP04.LIB",0
  136.         dc.b    "MAPINFO.DAT",0
  137.         dc.b    "TITEL.TXT",0
  138.     EVEN
  139.  
  140. _tab        dc.w    $dba2,0        ;crc
  141.         dc.w    _plie-_tab    ;patch list
  142.         dc.w    _introe-_tab    ;file name
  143.  
  144.         dc.w    $eb46,0        ;crc
  145.         dc.w    _plid-_tab    ;patch list
  146.         dc.w    _introd-_tab    ;file name
  147.  
  148.         dc.w    $1c05,$9a61    ;crc european,us/canada
  149.         dc.w    _pl-_tab    ;patch list
  150.         dc.w    _main-_tab    ;file name
  151.  
  152.         dc.w    $7d5c,0        ;crc
  153.         dc.w    _pld-_tab    ;patch list
  154.         dc.w    _desert-_tab    ;file name
  155.  
  156.         dc.w    $E442,0        ;crc
  157.         dc.w    _plm-_tab    ;patch list
  158.         dc.w    _moon-_tab    ;file name
  159.  
  160. ;============================================================================
  161. _start    ;    A0 = resident loader
  162. ;============================================================================
  163.  
  164.     ;initialize kickstart and environment
  165.         bra    _boot
  166.  
  167. _bootearly    move.l    (_resload,pc),a2    ;a2 = resload
  168.  
  169.     ;enable cache
  170.         move.l    #WCPUF_Base_NC|WCPUF_Exp_CB|WCPUF_Slave_CB|WCPUF_IC|WCPUF_DC|WCPUF_BC|WCPUF_SS|WCPUF_SB,d0
  171.         move.l    #WCPUF_All,d1
  172.         jsr    (resload_SetCPU,a2)
  173.         
  174.     ;get tags
  175.         lea    (_tag,pc),a0
  176.         jsr    (resload_Control,a2)
  177.         
  178.         move.l    (_custom1),d0
  179.         subq.l    #1,d0
  180.         bmi    .badver
  181.         cmp.l    #5,d0
  182.         bhs    .badver
  183.         
  184.         mulu    #8,d0
  185.         lea    (_tab,pc),a0
  186.         move.l    a0,a1
  187.         add.l    d0,a1
  188.         movem.w    (a1)+,d5-d6        ;d5/d6 = crc
  189.         move.w    (a1)+,a3
  190.         add.l    a0,a3            ;a3 = patchlist
  191.         move.w    (a1)+,a4
  192.         add.l    a0,a4            ;a4 = name
  193.  
  194.     ;get filesize
  195.         move.l    a4,a0
  196.         jsr    (resload_GetFileSizeDec,a2)
  197.         move.l    d0,d7            ;d7 = length
  198.         
  199.     ;load program
  200.         move.l    d7,d0
  201.         moveq    #0,d1
  202.         move.l    (4),a6
  203.         jsr    (_LVOAllocMem,a6)
  204.         move.l    d0,a5            ;a5 = address
  205.  
  206.         move.l    a4,a0
  207.         move.l    a5,a1
  208.         jsr    (resload_LoadFileDecrunch,a2)
  209.  
  210.     ;check version
  211.         move.l    d7,d0
  212.         move.l    a5,a0
  213.         jsr    (resload_CRC16,a2)
  214.         cmp.w    d5,D0
  215.         beq    .verok
  216.         cmp.w    d6,D0
  217.         beq    .verok
  218. .badver        pea    TDREASON_WRONGVER
  219.         jmp    (resload_Abort,a2)
  220. .verok
  221.     ;disable doslib
  222.         move.l    (4),a0
  223.         add.w    #_LVOOpenLibrary+2,a0
  224.         lea    _openlib_save,a1
  225.         move.l    (a0),(a1)
  226.         lea    _openlib,a1
  227.         move.l    a1,(a0)
  228.  
  229.     ;patch program
  230.         move.l    a3,a0
  231.         move.l    a5,a1
  232.         jsr    (resload_Patch,a2)
  233.  
  234.     ;disable cache
  235.         move.l    #WCPUF_Exp_NCS,d0
  236.         move.l    #WCPUF_Exp,d1
  237.         jsr    (resload_SetCPU,a2)
  238.  
  239.     ;start
  240.         jsr    (a5)
  241.  
  242.     ;quit
  243. .quit        pea    TDREASON_OK
  244.         move.l    (_resload,pc),a2
  245.         jmp    (resload_Abort,a2)
  246.  
  247. ;---------------
  248.  
  249. _plie        PL_START
  250.         PL_P    $5738,_load0
  251.     ;    PL_S    $5fa0,6                ;blithog
  252.         PL_PS    $6d60,_bplcon0
  253.     ;    PL_S    $7786,6                ;blithog
  254.         PL_END
  255.  
  256. _plid        PL_START
  257.         PL_P    $5810,_load0
  258.     ;    PL_S    $6078,6                ;blithog
  259.         PL_PS    $6e38,_bplcon0
  260.     ;    PL_S    $785e,6                ;blithog
  261.         PL_END
  262.  
  263. _pl        PL_START
  264.         PL_PS    $748,_cacheon1
  265.         PL_P    $1ee64,_load0
  266.         PL_P    $1f28e,_save0
  267.         PL_PS    $852,_allocbug
  268.     ;    PL_S    $1f6c6,6            ;blithog
  269.         PL_PS    $20492,_bplcon0
  270.         PL_PS    $4d4,_key
  271.     ;    PL_B    $10ed2,$66            ;beq -> bne
  272.     ;    PL_PS    $4fa,_keyfix
  273.     ;    PL_I    $10
  274.         PL_END
  275.  
  276. _key        lea    (_ciaa),a1
  277.     ;check if keyboard has caused interrupt
  278.         btst    #CIAICRB_SP,(ciaicr,a1)
  279.         beq    .end
  280.     ;read keycode
  281.         move.b    (ciasdr,a1),d0
  282.     ;set output to low and output mode (handshake)
  283.         clr.b    (ciasdr,a1)
  284.         or.b    #CIACRAF_SPMODE,(ciacra,a1)
  285.     ;calculate rawkeycode
  286.         not.b    d0
  287.         ror.b    #1,d0
  288.     ;set raw
  289.         move.b    (a3),(1,a3)            ;save last raw
  290.         move.b    (2,a3),(3,a3)            ;save last ascii
  291.         move.b    d0,(a3)                ;new raw
  292.         st    (4,a3)
  293.     ;set ascii
  294.         move.l    (a7),a0
  295.         jsr    ($576-$4d4-6,a0)
  296.  
  297.     ;better would be to use the cia-timer to wait, but we arn't know if
  298.     ;they are otherwise used, so using the rasterbeam
  299.     ;required minimum waiting is 75 µs, one rasterline is 63.5 µs
  300.     ;a loop of 3 results in min=127µs max=190.5µs
  301.         moveq    #3-1,d1
  302. .wait1        move.b    (_custom+vhposr),d0
  303. .wait2        cmp.b    (_custom+vhposr),d0
  304.     ;move.w    $dff006,$dff180
  305.         beq    .wait2
  306.         dbf    d1,.wait1
  307.  
  308.     ;set input mode
  309.         and.b    #~(CIACRAF_SPMODE),(ciacra,a1)
  310. .end        move.w    #INTF_PORTS,(intreq+_custom)
  311.         addq.l    #4,a7
  312.         movem.l    (a7)+,d0-a6
  313.         rte
  314.  
  315.     IFEQ 1
  316. _keyfix
  317.         move.b    $bfec01,d0
  318.         beq    .1
  319.         btst    #0,d0            ;up/down
  320.     ;    eor    #4,ccr
  321. .1        rts
  322.  
  323.     ENDC
  324.  
  325. _pld        PL_START
  326.         PL_PS    $748,_cacheon1
  327.         PL_P    $1ee74,_load1
  328.         PL_P    $1f29e,_save1
  329.         PL_PS    $852,_allocbug
  330.     ;    PL_S    $1f6d6,6            ;blithog
  331.         PL_PS    $204a2,_bplcon0
  332.         PL_PS    $4d4,_key
  333.         PL_END
  334.  
  335. _plm        PL_START
  336.         PL_PS    $746,_cacheon2
  337.         PL_P    $1ff1c,_load2
  338.         PL_P    $20346,_save2
  339.         PL_PS    $850,_allocbug
  340.     ;    PL_S    $2077e,6            ;blithog
  341.         PL_PS    $2154a,_bplcon0
  342.         PL_PS    $4d4,_key
  343.         PL_END
  344.  
  345. ;---------------
  346.  
  347. _cacheon1    move.l    #$25a8,d0            ;original
  348.  
  349. _cacheon    movem.l    d0-d1/a0-a1,-(a7)
  350.         move.l    #WCPUF_Exp_CB,d0
  351.         move.l    #WCPUF_Exp,d1
  352.         move.l    _resload,a0
  353.         jsr    (resload_SetCPU,a0)
  354.         movem.l    (a7)+,_MOVEMREGS
  355.         rts
  356.  
  357. _cacheon2    move.l    #$1df0,d0            ;original
  358.         bra    _cacheon
  359.  
  360. _bplcon0    move.w    (12,a6),d0            ;original
  361.         ror.w    #4,d0                ;original
  362.         or.w    #$200,d0            ;enable color output
  363.         rts
  364.  
  365. ;---------------
  366.  
  367. _load2        move.l    (8,a7),a0
  368.         addq.l    #4,a0
  369.         movem.l    a2,-(a7)
  370.         cmp.l    #"MAP/",(a0)
  371.         beq    .sub
  372.         cmp.l    #".DAT",(2,a0)            ;savegames
  373.         beq    .sub
  374.         moveq    #34-1,d0
  375.         lea    (_extram),a1
  376. .chk        move.l    a0,a2
  377. .cmp        move.b    (a2)+,d1
  378.         UPPER    d1
  379.         cmp.b    (a1)+,d1
  380.         bne    .fail
  381.         tst.b    d1
  382.         beq    .sub
  383.         bra    .cmp
  384. .fail        subq.l    #1,a1
  385. .s        tst.b    (a1)+
  386.         bne    .s
  387.         dbf    d0,.chk
  388.         movem.l    (a7)+,_MOVEMREGS
  389.         move.l    a0,(8,a7)
  390.         bra    _loadfile
  391.  
  392. .sub        movem.l    (a7)+,_MOVEMREGS
  393.         move.l    #"D02/",-(a0)
  394.         bra    _loadfile
  395.  
  396. _load1        move.l    (8,a7),a0
  397.         addq.l    #4,a0
  398.         movem.l    a2,-(a7)
  399.         cmp.l    #"MAP/",(a0)
  400.         beq    .sub
  401.         cmp.l    #".DAT",(2,a0)            ;savegames
  402.         beq    .sub
  403.         moveq    #13-1,d0
  404.         lea    (_extrad),a1
  405. .chk        move.l    a0,a2
  406. .cmp        move.b    (a2)+,d1
  407.         UPPER    d1
  408.         cmp.b    (a1)+,d1
  409.         bne    .fail
  410.         tst.b    d1
  411.         beq    .sub
  412.         bra    .cmp
  413. .fail        subq.l    #1,a1
  414. .s        tst.b    (a1)+
  415.         bne    .s
  416.         dbf    d0,.chk
  417.         movem.l    (a7)+,_MOVEMREGS
  418.         move.l    a0,(8,a7)
  419.         bra    _loadfile
  420.  
  421. .sub        movem.l    (a7)+,_MOVEMREGS
  422.         move.l    #"D01/",-(a0)
  423.         bra    _loadfile
  424.  
  425.  
  426. _load0        addq.l    #4,(8,a7)            ;skip "BI?:"
  427.  
  428.     ;in:
  429.     ;(4,a7)  memflag (-1=any 0=chip *=memptr)
  430.     ;(8,a7)  name
  431.     ;(12,a7) buffer $2028
  432.     ;out
  433.     ;d0 = mem
  434.     ;d1 = length
  435. _loadfile    movem.l    d2-d3/a2/a6,-(a7)
  436.         move.l    (_resload),a2
  437.         tst.l    (_MOVEMBYTES+4,a7)
  438.         beq    .calc
  439.         bpl    .load
  440.  
  441. .calc
  442.     illegal
  443.     ifeq 1
  444.         moveq    #8,d0                ;length
  445.         moveq    #0,d1                ;offset
  446.         move.l    (_MOVEMBYTES+8,a7),a0        ;name
  447.         move.l    a7,a1                ;dest
  448.         jsr    (resload_LoadFileOffset,a2)
  449.         cmp.l    #"TPWM",(a7)
  450.         beq    .packed
  451.         cmp.l    #"RNC"<<8+1,(a7)
  452.         beq    .packed
  453.         cmp.l    #"RNC"<<8+2,(a7)
  454.         beq    .packed
  455.         cmp.l    #"IMP!",(a7)
  456.         beq    .packed
  457.  
  458.         move.l    (_MOVEMBYTES+8,a7),a0        ;name
  459.         jsr    (resload_GetFileSize,a2)
  460.         bra    .getmem
  461.  
  462. .packed        move.l    (4,a7),d0            ;unpacked length
  463.  
  464. .getmem        moveq    #MEMF_CHIP,d1
  465.         tst.l    (_MOVEMBYTES+4,a7)
  466.         beq    .alloc
  467.         moveq    #MEMF_ANY,d1
  468. .alloc        move.l    (4),a6
  469.         jsr    (_LVOAllocMem,a6)
  470.         move.l    d0,(_MOVEMBYTES+4,a7)
  471.     endc
  472.  
  473. .load        move.l    (_MOVEMBYTES+8,a7),a0        ;name
  474.         move.l    (_MOVEMBYTES+4,a7),a1        ;dest
  475.         jsr    (resload_LoadFileDecrunch,a2)
  476.         move.l    d0,d1                ;length
  477.         move.l    (_MOVEMBYTES+4,a7),d0        ;address
  478.         movem.l    (a7)+,_MOVEMREGS
  479.         
  480. .end        rts
  481.  
  482. _save2        move.l    (4,a7),a0
  483.         move.l    #"D02/",(a0)
  484.         bra    _savefile
  485.  
  486. _save1        move.l    (4,a7),a0
  487.         move.l    #"D01/",(a0)
  488.         bra    _savefile
  489.  
  490. _save0        addq.l    #4,(4,a7)            ;skip "BI?:"
  491.  
  492.     ;in:
  493.     ;(4,a7)  name
  494.     ;(8,a7)  buffer
  495.     ;(12,a7) length
  496.     ;out
  497.     ;d0 = rc (0=success)
  498. _savefile    movem.l    a2,-(a7)
  499.         move.l    (_resload),a2
  500.         move.l    (_MOVEMBYTES+12,a7),d0
  501.         move.l    (_MOVEMBYTES+4,a7),a0
  502.         move.l    (_MOVEMBYTES+8,a7),a1
  503.         jsr    (resload_SaveFile,a2)
  504.         moveq    #0,d0
  505.         movem.l    (a7)+,_MOVEMREGS
  506.         rts
  507.  
  508. _openlib    cmp.l    #"dos.",(a1)
  509.         bne    .org
  510.         move.l    #-$10000,d0
  511.         rts
  512. .org        move.l    _openlib_save,-(a7)
  513.         rts
  514.  
  515.     ;game allocates same memory again and again
  516. _allocbug    move.l    (_bugmem),d0
  517.         bne    .already
  518.  
  519.         move.l    (4,a7),d0
  520.         move.l    #MEMF_CLEAR,d1
  521.         move.l    a6,-(a7)
  522.         move.l    4,a6
  523.         jsr    (_LVOAllocMem,a6)
  524.         move.l    (a7)+,a6
  525.         lea    (_bugmem),a0
  526.         move.l    d0,(a0)
  527.         rts
  528.  
  529. .already    move.l    d0,a0
  530.         move.l    (4,a7),d1
  531. .clr        clr.l    (a0)+
  532.         clr.l    (a0)+
  533.         subq.l    #8,d1
  534.         bhi    .clr
  535.         rts
  536.  
  537. ;---------------
  538.  
  539. _tag        dc.l    WHDLTAG_CUSTOM1_GET
  540. _custom1    dc.l    0
  541.         dc.l    0
  542. _openlib_save    dc.l    0
  543. _bugmem        dc.l    0
  544.  
  545. ;============================================================================
  546.  
  547.     INCLUDE    Sources:whdload/kick13.s
  548.  
  549. ;============================================================================
  550.  
  551.     END
  552.